package com.jidolstar.astro
{
	/**
	 * Dynamic Time(DT)을 적용하기 위한 클래스 
	 * @author Yongho,Ji (jidolstar@gmail.com)
	 * @since 2009.04.09
	 */ 
	public class ALDynamicalTime
	{
		/**
		 * 달의 평균운동에 따른 조석항(The secular tidal term in the mean motion of the Moon). 
		 * 이 값은 기본적으로 -26 arcsec/cy^2로 한다. 하지만 이것은 morrison과 Setphenson[2004]이 연구결과로 ΔT를 계산하기 위한 기본값이다.
		 * ELP-2000/82 lunar ephemeris에서 사용하는 달의 식변화는 이 값을 -25.858 arcsec/cy^2(Chapront, Chapront-Touzé, and Francou,2002)으로 계산한다.
		 * 그러므로 deltaT() 2번째 인자값에 사용할 값을 넣어주면 된다. cy는 Julian Century를 뜻한다.
		 * @see http://eclipse.gsfc.nasa.gov/SEcat5/secular.html
		 */ 
		static public const N_DOT:Number = -26;
		
		/**
		 * delta-T(ΔT)를 구하는 함수
		 * 
		 * <p>
		 * 식(eclipse)을 예견하기 위해 태양, 달의 위치는 Terrestiral Dynamical Time(TD)기반으로 계산된다.
		 * 왜냐하면 균일한 시간체계이기 때문이다. 그러나 일상생활에서 사용하는 세계시간대는 Universal Time(UT)를 기반으로 한다. 
		 * UT는 지구의 운동에 관련된 시간체계이기 때문에 균일한 시간이 아니다. 
		 * 그래서 식을 예측하기 위해 항상 UT와 TD의 차이값을 알아야만 한다. 이 차이값을 delta-T(ΔT)라고 하며 다음과 같은 관계를 가진다.
		 * </p>
		 * 
		 * <p>
		 * ΔT = TD - UT
		 * </p>
		 * 
		 * <p>
		 * 과거의 ΔT는 역사적 기록으로부터 추론된다. 일찍이 우리나라를 비롯한 유럽, 중동, 중국등의 나라에서는 수십건의 식(eclipse)을 관측해서 기록해왔다.
		 * 이러한 역사적 기록은 낮은 정확성에도 불구하고 과거 ΔT를 계산하는데 중요한 자료로 사용된다.
		 * 1609년 망원경을 이용한 천체관측을 시작한 이래로 달의 별을 가림현상(달의 엄폐)등을 관측하여 전보다 높은 정확도를 가진 관측자료를 만들게 되어 ΔT의 오차는 줄일 수 있게 되었다.
		 * </p>
		 * 
		 * <p> 
		 * 현대에는 지구 운동과 독립적인 원자시계 및 퀘이사 전파측정을 사용해서 거의 완벽한  ΔT를 계산할 수 있게 되었다. 
		 * 하지만 지구의 운동은  어떻게 변할지 예상하기 힘들다. 1965년부터 1980년까지 ΔT는 평균적으로 1년에 0.99초씩 증가했다. 
		 * 또 1985년부터 2000년까지 ΔT는 평균적으로 1년에  0.63초씩 증가했다. 2000년부터 2005년까지는 단지 0.18초 증가했다. 
		 * 미래의 ΔT는 매우 정확한 예측은 이론적으로는 힘들다. 대신 달에 의한 조수차로 지구의 자전 주기가 길어지는 것을 예상은 가능하다.
		 * 예측 계산에 따르면 2010년에는 ΔT는 +67초, 2050년에는 +93초, 2100년에는 203초, 그리고 2200년에는 442초가 될 것이라 예상할 수 있다. 
		 * </p>
		 * 
		 * <p>
		 * 이 계산식의 오차는 http://eclipse.gsfc.nasa.gov/SEcat5/deltat.html 문서를 참고한다.
		 * </p>
		 *  
		 * @see http://blog.jidolstar.com/486
		 * @see http://eclipse.gsfc.nasa.gov/SEcat5/deltatpoly.html
		 * @see http://eclipse.gsfc.nasa.gov/SEcat5/secular.html
		 * @see http://eclipse.gsfc.nasa.gov/SEcat5/deltat.html
		 * @see http://en.wikipedia.org/wiki/Delta-T
		 * @see http://katnani.egloos.com/498517
		 * 
  		 * @param fractionalYearOfJD Julian Date에 대한 분수값으로 표현한 년도값. -1999부터 +3000년까지
		 * @param ndot  the secular tidal term in the mean motion of the Moon. A default value is -26.0 arcsec/cy^2 
		 * @return ΔT, 단위 초(second)
		 */
		static public function deltaT( fractionalYearOfJD:Number, ndot:Number = -26 ):Number
		{
			var y:Number = fractionalYearOfJD;
			var dt:Number;
			var u:Number;
			var t:Number;
			
			//1986년~2050년까지는 최근 것이므로 속도 향상을 위해 먼저 처리하도록 한다.  
			if( y >= 1986 && y < 2050 )
			{
				if( y < 2005 )
				{
					t = y - 2000;
					dt = 63.86 + t * (0.3345 + t * (-0.060374 + t * (0.0017275 + t * (0.000651814 + t * 0.00002373599))));					
				}
				else
				{
					t = y - 2000;
					dt = 62.92 + ( 0.32217 + 0.005589 * t )* t;					
				}
			}
			else
			{
				if(y < -500)
				{
					u = (y-1820)/100;
					dt = -20 + 32 * u * u;
				}
				else if(y < 500)
				{
					u = y/100;
					dt = 10583.6 + u * (-1014.41 + u * (33.78311 + u * (-5.952053 + u * (-0.1798452 + u * (0.022174192 + u * 0.0090316521)))));
				}
				else if(y < 1600)
				{
					u = (y-1000)/100;
					dt = 1574.2 + u * (-556.01 + u * (71.23472 + u * (0.319781 + u * (-0.8503463 + u * (-0.005050998 + u * 0.0083572073)))));
				}
				else if(y < 1700)
				{
					t = y - 1600;
					dt = 120 + t * (-0.9808 + t * (-0.01532 + t / 7129));
				}
				else if(y < 1800)
				{
					t = y - 1700;
					dt = 8.83 + t * (0.1603 + t * (-0.0059285 + t * (0.00013336 - t / 1174000)));
				}
				else if(y < 1860)
				{
					t = y - 1800;
					dt = 13.72 + t * (-0.332447 + t * (0.0068612 + t * (0.0041116 + t * (-0.00037436 + t * (0.0000121272 + t * (-0.0000001699 + t * 0.000000000875))))));
				}
				else if(y < 1900)
				{
					t = y - 1860;
					dt = 7.62 + t * (0.5737 + t * (-0.251754 + t * (0.01680668 + t * (-0.0004473624 + t / 233174))));
				}
				else if(y < 1920)
				{
					t = y - 1900;
					dt = -2.79 + t * (1.494119 + t * (-0.0598939 + t * (0.0061966 + t * -0.000197)));
				}
				else if(y < 1941)
				{
					t = y - 1920;
					dt = 21.20 + t * (0.84493 + t * (-0.076100 + t * 0.0020936));
				}
				else if(y < 1961)
				{
					t = y - 1950;
					dt = 29.07 + 0.407 * t - t*t / 233 + t*t*t / 2547;
				}	
				else if(y < 1986)
				{
					t = y - 1975;
					dt = 45.45 + t * (1.067 + t * (-1/260 + t * -1/718));
				}
				else if(y < 2005)
				{
					t = y - 2000;
					dt = 63.86 + t * (0.3345 + t * (-0.060374 + t * (0.0017275 + t * (0.000651814 + t * 0.00002373599))));
				}
				else if(y < 2050)
				{
					t = y - 2000;
					dt = 62.92 + ( 0.32217 + 0.005589 * t )* t;
				}
				else if(y < 2150)
				{
					u = (y-1820)/100;
					dt = -20 + 32 * u * u - 0.5628 * (2150 - y);
				}
				else
				{
					u = (y-1820)/100;
					dt = -20 + 32 * u * u;
				}
			}			
			
			//참고 : http://eclipse.gsfc.nasa.gov/SEcat5/secular.html
			if( N_DOT != ndot ) 
			{
				t = (y - 1955.0)/100;
				dt += -0.91072 * ( ndot - N_DOT ) * t * t;
			}
			return dt;						
		} 
	}
}